package com.whisper.utils;

import com.whisper.config.JedisDBPool;
import redis.clients.jedis.Jedis;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * Redis数据库操作方法封装
 */
public class RedisQuery {

    private static final RedisQuery redisQuery = null;

    /**
     * 获取RedisQuery实例
     *
     * @return
     */
    public static RedisQuery getInstance() {
        if (redisQuery == null) {
            return new RedisQuery();
        }
        return redisQuery;
    }

    /**
     * 添加数据,相同key会覆盖数据，所以也相当于改
     */
    public void set(String key, String value) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.set(key, value);
        //Jedis3.0版本后jedisPool.returnResource(final Jedis resource)方法已被弃用，用jedis.close()代替 来归还连接
        jedis.close();
    }

    public <T> void setObject(String key, Object value) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.set(key.getBytes(StandardCharsets.UTF_8), SerializeUtil.serialize(value));
        //Jedis3.0版本后jedisPool.returnResource(final Jedis resource)方法已被弃用，用jedis.close()代替 来归还连接
        jedis.close();
    }

    public <T> void pushObject(String key, Object value) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.rpush(key.getBytes(StandardCharsets.UTF_8), SerializeUtil.serialize(value));
        jedis.close();
    }


    /**
     * 添加数据，带超时时间，超时自动销毁
     */
    public void setex(String key, String value, int seconds){
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.setex(key, seconds, value);
        jedis.close();
    }

    /**
     * 根据key删除数据
     */
    public void deleteByKey(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.del(key);
        jedis.close();
    }

    /**
     * 根据key查询
     */
    public String getByKey(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        String value = jedis.get(key);
        jedis.close();
        return value;
    }

    /**
     * 根据key查询
     */
    public Object getObjectByKey(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        byte[] value = jedis.get(key.getBytes(StandardCharsets.UTF_8));
        jedis.close();
        return value == null ? null : SerializeUtil.unSerialize(value);
    }

    /**
     * 根据key查询
     */
    public Object getObjectList(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        List<byte[]> value = jedis.lrange(key.getBytes(StandardCharsets.UTF_8), 0 ,-1);
        jedis.close();
        return value;
    }

    /**
     * 查询某条数据是否存在
     */
    public boolean isExist(String key){
        Jedis jedis = JedisDBPool.getConnectJedis();
        boolean exist = jedis.exists(key);
        jedis.close();
        return exist;
    }
}
